/* 封装axios用于发送请求 */
import axios from 'axios'
import { Toast } from 'vant'
import store from '@/store'
// 创建一个新的axios实例
const request = axios.create({
  baseURL: 'http://smart-shop.itheima.net/index.php?s=/api/',
  timeout: 5000,
  headers: {
    platform: 'H5'
  }
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  const token = store.getters.token
  if (token) {
    config.headers['Access-Token'] = token
    config.headers.platform = 'H5'
  }
  // 在发送请求之前做些什么
  // 在每次发送请求之前，调用Toast的loading方法，用于显示一个加载提示框。
  Toast.loading({
    // 设置提示框的文本消息，这里是"请求中..."，用于告知用户正在进行网络请求。
    message: '请求中...',
    // 设置是否阻止点击背景区域。true表示阻止，即在加载提示框显示时，不允许用户点击背后的界面元素。
    forbidClick: true,
    // 设置加载动画的类型，这里选择了'spinner'，通常表现为旋转的圆形动画。
    loadingType: 'spinner',
    // 设置加载提示框的持续时间，0表示无限期显示，直到手动关闭。
    duration: 0
  })
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

/**
 * 响应拦截器的使用函数
 * 该函数用于在请求响应返回后进行处理。它主要负责检查响应的状态码，
 * 如果状态码不是200，则显示错误信息，并拒绝该承诺；否则，返回响应数据。
 * @param {Object} response - Axios的响应对象
 * @returns {Promise} 返回处理后的响应数据或错误信息的拒绝承诺
 */
request.interceptors.response.use(function (response) {
  // 解析响应数据
  const res = response.data
  // 检查响应状态码是否为200
  if (res.status !== 200) {
    // 如果状态码不为200，显示错误信息
    Toast(res.message)
    // 拒绝承诺并返回错误信息
    return Promise.reject(res.message)
  } else {
    // 清除 loading 中的效果
    Toast.clear()
  }
  // 如果状态码为200，返回响应数据
  // 对响应数据做点什么
  return res
}, function (error) {
  // 处理请求错误
  // 此处可以添加对不同错误类型的处理逻辑
  return Promise.reject(error)
})

export default request
